<?php 
/**
 * Yjnic_Upload 上传类
 * @package     Yjnic
 * @author      prettyyjnic <prettyyjnic@qq.com> 2015-11-27
 */

class Yjnic_Upload {

    protected $_storage_ins = '';
    /**
     * 默认上传配置
     * @var array
     */
    protected $_configs = array(
        'max_size'       =>  0, //上传的文件大小限制 (0-不做限制)
        'exts'          =>  array('jpg','gif'), //允许上传的文件后缀
        'replace'       =>  false, //存在同名是否覆盖
        'hash'          =>  true, //是否生成hash编码
    );

    public function __construct($configs){
        if (IS_SAE) {
            $this->_storage_ins = new Yjnic_Sae_Storage($configs);
        }else{
            $this->_storage_ins = new Yjnic_Storage($configs);
        }
        $this->_configs = array_merge($this->_configs, $configs);
    }

    // 设置bucket
    public function bucket($bucket){
        $this->_storage_ins->bucket($bucket);
        $this->_configs['bucket'] = $bucket;
        return $this;
    }

    public function upload($file){
        $upload = array($file);
        $ret = $this->uploadMutily($upload);
        return $ret[0];
    }

    /**
     * 批量上传
     * @param $files, 要上传的文件的buffer或者路径数组
     */
    public function uploadMutily($files=''){
        if (empty($files)) {
            $files = $_FILES;//默认为$_FILES
        }
         /* 逐个检测并上传文件 */
        $info    =  array();
        if(function_exists('finfo_open')){
            $finfo   =  finfo_open ( FILEINFO_MIME_TYPE );
        }
        // 对上传文件数组信息处理       
        foreach ($files as $key => $file) {
            $file['name']  = strip_tags($file['name']);
            /* 通过扩展获取文件类型，可解决FLASH上传$FILES数组返回文件类型错误的问题 */
            if(isset($finfo)){
                $file['type']   =   finfo_file ( $finfo ,  $file['tmp_name'] );
            }
            /* 获取上传文件后缀，允许上传无后缀文件 */
            $file['ext']    =   pathinfo($file['name'], PATHINFO_EXTENSION);
            /* 文件上传检测 */
            $this->_check($file);
            $path = $this->_createSavePath($file['name']);
            /* 保存文件 并记录保存成功的文件 */
            $file_path = $this->_storage_ins->upload($file['tmp_name'], $path, $this->_configs['replace']);
            if ( $file_path ) {
                unset($file['error'], $file['tmp_name']);
                $file['save_path'] = $file_path;
                if (IS_SAE) {
                    $file['path'] = 'http://'.$_SERVER['HTTP_APPNAME'].'-'.$this->_configs['bucket'].'.stor.sinaapp.com/' . $file_path;
                }else{
                    $file['path'] = WEB_PATH . str_replace(API_ROOT, '', $file_path);
                }
                $info[$key] = $file;
            }
        }
        if(isset($finfo)){
            finfo_close($finfo);
        }
        return empty($info) ? false : $info;
    }

    /**
     * 生成保存的子目录
     * @param $filename string 上传的文件名
     */
    protected function _createSavePath($filename){
        $sub_path = date('Y-m-d') . '/';

        $file_ext = pathinfo($filename, PATHINFO_EXTENSION);
        if ($this->_configs['hash']) {
            $sub_path .= md5( basename( $filename ) ) . '.' . $file_ext ;
        }else{
            $sub_path .= basename( $filename );
        }
        return $sub_path;
    }

    /**
     * 检查是否合法
     */
    protected function _check($file){
        /* 无效上传 */
        if (empty($file['name']) || !empty($file['error'])){
            throw new Yjnic_Exception("未知上传错误！", 400);
        }
        /* 检查是否合法上传 */
        if (!is_uploaded_file($file['tmp_name'])) {
            throw new Yjnic_Exception("非法上传文件！", 400);
        }
        /* 检查文件大小 */
        if ( (0 !== $this->_configs['max_size']) && ($file['size'] > $this->_configs['max_size']) ) {
            throw new Yjnic_Exception('上传文件大小不符！最大大小为'.(($this->_configs['max_size'])/1024).'K', 400);
        }
        /* 检查文件后缀 */
        if (!in_array($file['ext'], $this->_configs['exts'])) {
            throw new Yjnic_Exception("上传文件后缀非法！", 400);
        }
        /* 对图像文件进行严格检测 */
        $ext = strtolower($file['ext']);
        if(in_array($ext, array('gif','jpg','jpeg','bmp','png','swf'))) {
            $imginfo = getimagesize($file['tmp_name']);
            if(empty($imginfo) || ($ext == 'gif' && empty($imginfo['bits']))){
                throw new Yjnic_Exception("非法图像文件！", 400);                  
            }
        }
    }
}